//******************************************************************************
// ServeurEcouteur.java
// E.Lefran�ois 10 f�vrier 2001
// Projet "Chat"
//******************************************************************************
import java.io.*;
import java.awt.*;
import java.net.*;
import java.util.LinkedList;
import java.util.StringTokenizer;

import model.Musique;

//==============================================================================
// Classe "ServeurEcouteur"
// Activit� concurrente dont le r�le consiste � �couter toutes les informations
// envoy�es par le serveur.
// La connexion avec le serveur est contr�l�e de mani�re permanente.  En cas de
// probl�me, cette activit� affiche un message d'avertissement et stoppe son
// ex�cution.
//==============================================================================
public class ServeurEcouteur extends Thread {
// Variables d'instance


    /**
     * @supplierRole canalDentree 
     */
    private ObjectInputStream canalDentree; // Canal d'entr�e avec le serveur


    /**
     * @supplierRole a_gui 
     */
    private InterfaceUtilisateur a_gui;  // Interface utilisateur (boutons,
                                         // zones d'affichage)


    /**
     * @supplierRole a_client 
     */
    private Client a_client;            // client associ�

// Constructeur(s)
   public ServeurEcouteur (InputStream is, InterfaceUtilisateur gui,
                           Client client) {
      a_client = client;
      a_gui = gui;

      try {
          canalDentree = new ObjectInputStream (is);
          this.start();		// Pour d�marrer l'activit� concurrente
      }
      catch (Exception e) {
         a_gui.afficherAvertissement ("!! PROBLEME DE CONNEXION !!",
                                       e.toString());
      }
   }


// Code de l'activit� concurrente
   public void run () {
          String message = "";
          String ligneRecue;
          Object recep;
          try {
              while (true) {
                    try {
                    	recep = canalDentree.readObject();
                    	if(recep instanceof LinkedList<?>) {
                    		if(((LinkedList<?>) recep).getFirst() instanceof String) {
                    			a_gui.afficherDansZoneChat("LL", recep.toString());
                    		}
                    		else
                    		{
                    			LinkedList<Musique> list = ((LinkedList<Musique>) recep);
                    			for (int i = 0; i < list.size(); i++) {
                    				a_gui.afficherDansZoneChat("LLM", list.get(i).getId() + "--" + list.get(i).getTitre());
                    			}
                    		}
                    	}
                    	else {
                    		ligneRecue = (String)recep;
    						if (ligneRecue == null) {   // Connexion interrompue
    	                        message = "Terminaison normale";    // par le serveur
    	                        break;        // ("null"signale la fin d'un stream)
    	                    }
    	                    analyserLigneRecue(ligneRecue);
                    	}
					} catch (ClassNotFoundException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}         
              }
          }

          catch (IOException e) { message = e.toString(); }
          finally {
                a_client.ev_connexionFermee (message);
          }
   }

   private void analyserLigneRecue(String ligne) {
      StringTokenizer st = new StringTokenizer (ligne, "#");
      try {
          String typeInfo = st.nextToken();
          if (typeInfo.equals("CTR")){
              String info = st.nextToken();
              if (info.equals("LOGIN_OK")) a_client.ev_sessionAcceptee();
              else if (info.equals("LOGIN_ERROR"))
                  a_client.ev_sessionRefusee(" !! SESSION REFUSEE !! " +
                                             st.nextToken());
              else if (info.equals("CONNEXION_FERMEE"))
                  a_client.ev_connexionFermee("FIN SESSION " + st.nextToken());
            	  
              else signalerErreur(ligne);
          }
          else if (typeInfo.equals("DATA")){
              String idSource = st.nextToken();
              a_gui.afficherDansZoneChat  (idSource, st.nextToken());
          }
          else signalerErreur(ligne);
      }
      catch (Exception e) {signalerErreur(ligne);}
   }

   private void signalerErreur (String ligneRecue) {
      a_gui.afficherAvertissement
         (" !! INFORMATION RECUE ERRONEE !! ", ligneRecue);
   }
}



